커뮤니케이션 프록시(Communication Proxy)는 원격에서 작업을 수행하고,
결과를 모아 로컬에 중계해주는 컴포넌트이다.
struct Pingable{
virtual wstring ping(const wstring& massage)=0;
};
struct Pong: Pingable{
wstring ping(const wstring& message) override {
return message+L" pong";
}
};
void tryit(Pingalbe& pp){
wcout<<pp.ping(L"ping")<<"\n";
}
Pong pp;
for(int i=0; i<3; ++i){
tryit(pp);
}
위의 코드는 동일한 컴퓨터 내에서 동일한 컴퓨터 내의 객체를 이용하는 코드이다.
이를 원거리에 떨어져 있는 웹서버로 옮긴다고 할 때,
옮겨진 컴퓨터에서 C++ 대신 ASP.NET과 같은 다른 플랫폼을 사용하기로 했다고 하자.
[Route("api/[controller]")]
public class PingPongController: Controller{
[HttpGet("{msg}")]
public string Get(string msg){
return msg+" pong";
}
}
위와 같이 원거리 컴퓨터의 객체를 사용하기 위한 커뮤니케이션 프록시 RemotePong(기존 Pong)을 대체
MS REST SDK를 이용한 원격 통신 구현
struct RemotePong: Pingable{
wstring ping(const wstring& message) override{
wsting result;
http_client client(U("http://localhost:9149/"));
uri_builder builder(U("/api/pingpong/"));
builder.append(message);
pplx::task<wstring> task=client.request(
methods::GET, builder.to_string())
.then([=](http_response r)
{
return r.extract_string();
});
task.wait();
return task.get();
}
};
RemotePong pp;
for(int i=0; i<3; ++i){
tryit(pp);
}